package com.whfc.fmam.dao;

import com.whfc.fmam.entity.bo.FmamWeighNote;
import com.whfc.fmam.entity.dto.*;
import com.whfc.fmam.entity.qo.RecvSendAnalysisQO;
import com.whfc.fmam.entity.qo.WeighNoteListQO;
import com.whfc.fmam.entity.qo.WeighNoteQO;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.Collection;
import java.util.Date;
import java.util.List;

@Repository
public interface FmamWeighNoteMapper {
    int deleteByPrimaryKey(Long id);

    int insert(FmamWeighNote record);

    int insertSelective(FmamWeighNote record);

    FmamWeighNote selectByPrimaryKey(Long id);

    int updateByPrimaryKeySelective(FmamWeighNote record);

    int updateByPrimaryKey(FmamWeighNote record);

    /**
     * 批量插入或更新磅单
     *
     * @param weighNoteList
     * @return
     */
    int batchInsertOrUpdate(@Param("weighNoteList") Collection<FmamWeighNote> weighNoteList);

    /**
     * 查询磅单
     *
     * @param guid
     * @return
     */
    FmamWeighNote selectByGuid(@Param("guid") String guid);

    /**
     * 获取下传同步的磅单
     *
     * @param deptId
     * @param weighRoomId
     * @param lastSyncTime
     * @return
     */
    List<FmamWeighNote> selectSyncWeighNoteList(@Param("deptId") Integer deptId, @Param("weighRoomId") Integer weighRoomId, @Param("lastSyncTime") Date lastSyncTime);

    /**
     * 收发料明细台账列表
     *
     * @param weighNoteListQO
     * @return
     */
    List<FmamWeighNoteDTO> selectWeighNoteList(WeighNoteListQO weighNoteListQO);

    /**
     * 查询物资供应商发料台账列表
     *
     * @param request
     * @return
     */
    List<FmamRecvSendAnaMatDTO> selectSupplierWeighNoteList(RecvSendAnalysisQO request);

    /**
     * 查询物资供应商超负差数排名列表
     *
     * @param request
     * @return
     */
    List<FmamSendSupplierDTO> selectSupplierActualDiff(RecvSendAnalysisQO request);

    /**
     * 查询物资供应商超负差比排名列表
     *
     * @param request
     * @return
     */
    List<FmamSendSupplierDTO> selectSupplierDiffRate(RecvSendAnalysisQO request);

    /**
     * 查询按材料收料和发料汇总分析的原始数据
     *
     * @param request
     * @return
     */
    List<FmamRecvSendAnaMatDTO> selectRecvSendAnaMatDTO(RecvSendAnalysisQO request);

    /**
     * 根据材料id查找磅单列表
     *
     * @param matId
     * @param type
     * @param diffResult
     * @return
     */
    List<FmamRecvSendAnaMatDTO> selectWeighNoteListByMatId(@Param("matId") Long matId, @Param("type") Integer type, @Param("diffResult") Integer diffResult);

    /**
     * 查询按材料类别收料和发料汇总分析的原始数据
     *
     * @param request
     * @return
     */
    List<FmamRecvSendAnaMatTypeDTO> selectRecvSendAnaMatTypeDTO(RecvSendAnalysisQO request);

    /**
     * 根据材料类别查找磅单列表
     *
     * @param matTypeIdList
     * @param type
     * @param diffResult
     * @return
     */
    List<FmamRecvSendAnaMatDTO> selectWeighNoteListByMatTypeId(@Param("matTypeIdList") List<Long> matTypeIdList, @Param("type") Integer type, @Param("diffResult") Integer diffResult);

    /**
     * 查询按供应商分组的原始数据
     *
     * @param request
     * @return
     */
    List<FmamRecvSendAnaMatDTO> selectSendMatDTOBySupplier(RecvSendAnalysisQO request);

    /**
     * 物资偏差分析总体统计的原始数据
     *
     * @param request
     * @return
     */
    List<FmamRecvSendAnaMatDTO> selectDiffData(RecvSendAnalysisQO request);

    /**
     * 根据供应商id查找磅单列表
     *
     * @param sendSupplierId
     * @param diffResult
     * @return
     */
    List<FmamRecvSendAnaMatDTO> selectWeighNoteListBySupplier(@Param("sendSupplierId") Integer sendSupplierId, @Param("diffResult") Integer diffResult);

    /**
     * 获取磅单数量
     *
     * @param weighNoteQO 磅单数量请求参数
     * @return total 磅单数量
     */
    Integer selectWeighNoteTotal(WeighNoteQO weighNoteQO);


    /**
     * 根据收发料类型统计
     *
     * @param deptId    组织机构ID
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @param sources   来源列表
     * @return 收发料类型统计
     */
    List<RecvSendCountDTO> selectRecvSendTypeTotal(@Param("deptId") Integer deptId, @Param("startTime") Date startTime, @Param("endTime") Date endTime, @Param("sources") List<Integer> sources);

    /**
     * 查找今日最后一个磅单编号
     *
     * @param deptId 组织机构ID
     * @param date   日期
     * @return 磅单编号
     */
    String selectLastWeighNoteCodeByDate(@Param("deptId") Integer deptId, @Param("date") Date date);

    /**
     * 统计磅单确认重量
     *
     * @param weighNoteQO 磅单查询QO
     * @return 确认重量
     */
    Double selectConfirmWeighTotal(WeighNoteQO weighNoteQO);
    /**
     * 统计磅单实际重量
     *
     * @param weighNoteQO 磅单查询QO
     * @return 实际重量
     */
    Double selectActualWeighTotal(WeighNoteQO weighNoteQO);

    /**
     * 查找磅单分析列表
     *
     * @param weighNoteQO 磅单查询QO
     * @return 磅单分析列表
     */
    List<FmamWeighNoteAnalysisDTO> selectWeighNoteAnalysisDTOList(WeighNoteQO weighNoteQO);


    /**
     * 根据材料id查找磅单列表
     *
     * @param weighNoteListQO 磅单列表请求参数
     * @return 磅单列表
     */
    List<FmamWeighNoteDTO> selectWeighNoteByMatId(WeighNoteListQO weighNoteListQO);

    /**
     * 获取随机磅单
     *
     * @return 磅单
     */
    FmamWeighNote getRandomWeighNote();


}